//
// Created by fairy on 2025/3/30 18:25.
//
#ifndef ZQ_CPU_H
#define ZQ_CPU_H
#include<zq_conf.h>

namespace zq
{
    namespace cpu
    {
        // C55x的一堆CPU寄存器映射
        /******************** 中断控制类寄存器 ​********************/
        BEGIN_MEMORY_REGION(IER0, 0x0000) // 中断使能寄存器0   [15-0]
            // 中断使能寄存器
            DECLARE_MEMORY_BIT(DMAC5, 15) // DMA通道5中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DMAC4, 14) // DMA通道4中断标志/屏蔽位
            DECLARE_MEMORY_BIT(XINT2, 13) // XINT2外部中断或MMC/SD2中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT2, 12) // McBSP2接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(INT3, 11) // 外部中断3或看门狗定时器中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DSPINT, 10) // HPI主机到DSP的中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DMAC1, 9) // DMA通道1中断标志/屏蔽位
            DECLARE_MEMORY_BIT(USB, 8) // USB中断标志/屏蔽位
            DECLARE_MEMORY_BIT(XINT1, 7) // XINT1外部中断或MMC/SD1中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT1, 6) // McBSP1接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT0, 5) // McBSP0接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(TINT0, 4) // 定时器0中断标志位
            DECLARE_MEMORY_BIT(INT2, 3) // 外部中断2标志位
            DECLARE_MEMORY_BIT(INT0, 2) // 外部中断1标志位（注意表格中疑似标注错误）
            DECLARE_MEMORY_BITS_FIELD(RSVED, 2, 0) // 位1-0为保留位（0x0002-0x0001），需保持写0
        END_MEMORY_REGION()

        BEGIN_MEMORY_REGION(IFR0, 0x0001) // 中断标志寄存器0   [15-0]
            DECLARE_MEMORY_BIT(DMAC5, 15) // DMA通道5中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DMAC4, 14) // DMA通道4中断标志/屏蔽位
            DECLARE_MEMORY_BIT(XINT2, 13) // XINT2外部中断或MMC/SD2中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT2, 12) // McBSP2接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(INT3, 11) // 外部中断3或看门狗定时器中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DSPINT, 10) // HPI主机到DSP的中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DMAC1, 9) // DMA通道1中断标志/屏蔽位
            DECLARE_MEMORY_BIT(USB, 8) // USB中断标志/屏蔽位
            DECLARE_MEMORY_BIT(XINT1, 7) // XINT1外部中断或MMC/SD1中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT1, 6) // McBSP1接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT0, 5) // McBSP0接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(TINT0, 4) // 定时器0中断标志位
            DECLARE_MEMORY_BIT(INT2, 3) // 外部中断2标志位
            DECLARE_MEMORY_BIT(INT0, 2) // 外部中断1标志位（注意表格中疑似标注错误）
            DECLARE_MEMORY_BITS_FIELD(RSVED, 2, 0) // 位1-0为保留位（0x0002-0x0001），需保持写0
        END_MEMORY_REGION()

        /******************** 状态寄存器组 ​***********************/
        DECLARE_MEMORY_REGION(ST0_55, 0x0002) // C55x状态寄存器0  [15-0]
        DECLARE_MEMORY_REGION(ST1_55, 0x0003) // C55x状态寄存器1  [15-0]
        DECLARE_MEMORY_REGION(ST3_55, 0x0004) // C55x状态寄存器3  [15-0]
        DECLARE_MEMORY_REGION(RSVD05, 0x0005) // 保留区域          [15-0]
        DECLARE_MEMORY_REGION(ST0, 0x0006) // 标准状态寄存器0  [15-0]
        DECLARE_MEMORY_REGION(ST1, 0x0007) // 标准状态寄存器1  [15-0]

        /******************** 累加器寄存器组 ​*********************/
        //-- 累加器0分解寄存器 --
        DECLARE_MEMORY_REGION(AC0L, 0x0008) // 低16位数据      [15-0]
        DECLARE_MEMORY_REGION(AC0H, 0x0009) // 高16位数据      [31-16]
        DECLARE_MEMORY_REGION(AC0G, 0x000A) // 保护位          [39-32]

        //-- 累加器1分解寄存器 --
        DECLARE_MEMORY_REGION(AC1L, 0x000B) // 低16位数据      [15-0]
        DECLARE_MEMORY_REGION(AC1H, 0x000C) // 高16位数据      [31-16]
        DECLARE_MEMORY_REGION(AC1G, 0x000D) // 保护位          [39-32]

        /******************** 运算辅助寄存器 ​*********************/
        DECLARE_MEMORY_REGION(TREG, 0x000E) // 临时数据寄存器    [15-0]（原T3）
        DECLARE_MEMORY_REGION(TRN0, 0x000F) // 过渡寄存器        [15-0]

        /******************** 地址指针寄存器 ​*********************/
        DECLARE_MEMORY_REGION(AR0, 0x0010) // 辅助寄存器0       [15-0]
        DECLARE_MEMORY_REGION(AR1, 0x0011) // 辅助寄存器1       [15-0]
        DECLARE_MEMORY_REGION(AR2, 0x0012) // 辅助寄存器2       [15-0]
        DECLARE_MEMORY_REGION(AR3, 0x0013) // 辅助寄存器3       [15-0]
        DECLARE_MEMORY_REGION(AR4, 0x0014) // 辅助寄存器4       [15-0]
        DECLARE_MEMORY_REGION(AR5, 0x0015) // 辅助寄存器5       [15-0]
        DECLARE_MEMORY_REGION(AR6, 0x0016) // 辅助寄存器6       [15-0]
        DECLARE_MEMORY_REGION(AR7, 0x0017) // 辅助寄存器7       [15-0]


        // 系统控制类寄存器
        DECLARE_MEMORY_REGION(SP, 0x0018) // 栈指针寄存器           [15-0]
        DECLARE_MEMORY_REGION(BK03, 0x0019) // 循环缓冲区大小寄存器    [15-0]
        DECLARE_MEMORY_REGION(BRC0, 0x001A) // 块重复计数器          [15-0]
        DECLARE_MEMORY_REGION(RSAOL, 0x001B) // 块重复起始地址寄存器   [15-0]
        DECLARE_MEMORY_REGION(REAOL, 0x001C) // 块重复结束地址寄存器   [15-0]
        DECLARE_MEMORY_REGION(PMST, 0x001D) // 处理器模式状态寄存器   [15-0]
        DECLARE_MEMORY_REGION(XPC, 0x001E) // 程序计数器扩展寄存器  [7-0]
        DECLARE_MEMORY_REGION(RSVD1F, 0x001F) // 保留寄存器           [15-0]

        // 数据操作类寄存器
        DECLARE_MEMORY_REGION(T0, 0x0020) // 临时数据寄存器0      [15-0]
        DECLARE_MEMORY_REGION(T1, 0x0021) // 临时数据寄存器1      [15-0]
        DECLARE_MEMORY_REGION(T2, 0x0022) // 临时数据寄存器2      [15-0]
        DECLARE_MEMORY_REGION(T3, 0x0023) // 临时数据寄存器3      [15-0]

        // 累加器扩展（AC2）
        DECLARE_MEMORY_REGION(AC2L, 0x0024) // 累加器2低16位       [15-0]
        DECLARE_MEMORY_REGION(AC2H, 0x0025) // 累加器2高16位       [31-16]
        DECLARE_MEMORY_REGION(AC2G, 0x0026) // 累加器2保护位       [39-32]

        // 数据指针类寄存器
        DECLARE_MEMORY_REGION(CDP, 0x0027) // 系数数据指针           [15-0]

        // 累加器扩展（AC3）
        DECLARE_MEMORY_REGION(AC3L, 0x0028) // 累加器3低16位        [15-0]
        DECLARE_MEMORY_REGION(AC3H, 0x0029) // 累加器3高16位        [31-16]
        DECLARE_MEMORY_REGION(AC3G, 0x002A) // 累加器3保护位        [39-32]

        // 内存管理单元
        DECLARE_MEMORY_REGION(DPH, 0x002B) // 扩展数据页指针        [6-0]
        DECLARE_MEMORY_REGION(MDP05, 0x002C) // 保留寄存器           [6-0]（原MDP05）
        DECLARE_MEMORY_REGION(MDP67, 0x002D) // 保留寄存器           [15-0]（原MDP67）
        DECLARE_MEMORY_REGION(DP, 0x002E) // 二级数据页指针        [15-0]
        DECLARE_MEMORY_REGION(PDP, 0x002F) // 外设数据页起始地址     [8-0]

        // 循环缓冲控制类
        DECLARE_MEMORY_REGION(BK47, 0x0030) // AR4-7循环缓冲区大小    [15-0]
        DECLARE_MEMORY_REGION(BKC, 0x0031) // CDP循环缓冲区大小     [15-0]
        DECLARE_MEMORY_REGION(BSA01, 0x0032) // AR0-1循环起始地址     [15-0]
        DECLARE_MEMORY_REGION(BSA23, 0x0033) // AR2-3循环起始地址     [15-0]
        DECLARE_MEMORY_REGION(BSA45, 0x0034) // AR4-5循环起始地址     [15-0]
        DECLARE_MEMORY_REGION(BSA67, 0x0035) // AR6-7循环起始地址     [15-0]
        DECLARE_MEMORY_REGION(BSAC, 0x0036) // 系数循环起始地址      [15-0]
        DECLARE_MEMORY_REGION(BIOS, 0x0037) // 数据页指针存储（128字数据表）[15-0]

        // 特殊功能寄存器
        DECLARE_MEMORY_REGION(TRN1, 0x0038) // 过渡寄存器1          [15-0]（原BIOS）
        DECLARE_MEMORY_REGION(BRC1, 0x0039) // 块重复计数器1        [15-0]
        DECLARE_MEMORY_REGION(BRS1, 0x003A) // 块重复保存寄存器1     [15-0]
        DECLARE_MEMORY_REGION(CSR, 0x003B) // 单次重复计算寄存器    [15-0]
        DECLARE_MEMORY_REGION(RSA0H, 0x003C) // 块重复起始地址高位    [23-16]

        // 重复地址类寄存器
        DECLARE_MEMORY_REGION(RSA0L, 0x003D) // 重复起始地址0低16位   [15-0]
        DECLARE_MEMORY_REGION(REA0H, 0x003E) // 重复起始地址0高8位    [23-16]
        DECLARE_MEMORY_REGION(REA0L, 0x003F) // 重复结束地址0低16位   [15-0]
        DECLARE_MEMORY_REGION(RSA1H, 0x0040) // 重复起始地址1高8位    [23-16]
        DECLARE_MEMORY_REGION(RSA1L, 0x0041) // 重复起始地址1低16位   [15-0]
        DECLARE_MEMORY_REGION(REA1H, 0x0042) // 重复结束地址1高8位    [23-16]
        DECLARE_MEMORY_REGION(REA1L, 0x0043) // 重复结束地址1低16位   [15-0]

        // 控制计数器类
        DECLARE_MEMORY_REGION(RPTC, 0x0044) // 重复计数器            [15-0]

        // 中断调试类
        BEGIN_MEMORY_REGION(IER1, 0x0045) // 中断使能寄存器1       [15-0]
            DECLARE_MEMORY_BITS_FIELD(RSVED, 5, 11) // [15:11] 保留位（必须写0）
            DECLARE_MEMORY_BIT(RTOS, 10) // [10]    实时操作系统中断标志/掩码位
            DECLARE_MEMORY_BIT(DLOG, 9) // [9]     数据日志中断标志/掩码位
            DECLARE_MEMORY_BIT(BERR, 8) // [8]     总线错误中断标志/掩码位
            DECLARE_MEMORY_BIT(I2C, 7) // [7]     I2C中断标志/掩码位（原表12C应为I2C）
            DECLARE_MEMORY_BIT(TINT1, 6) // [6]     定时器1中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC3, 5) // [5]     DMA通道3中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC2, 4) // [4]     DMA通道2中断标志/掩码位（原表RMAC2应为DMAC2）
            DECLARE_MEMORY_BIT(INT4_RTC, 3) // [3]     外部中断4或实时时钟中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC0, 2) // [2]     DMA通道0中断标志/掩码位
            DECLARE_MEMORY_BIT(XINT0, 1) // [1]     McBSP发送0中断标志/掩码位（原表XINTO应为XINT0）
            DECLARE_MEMORY_BIT(INT1, 0) // [0]     外部用户中断1标志/掩码位
        END_MEMORY_REGION()

        BEGIN_MEMORY_REGION(IFR1, 0x0046) // 中断标志寄存器1       [15-0]
            DECLARE_MEMORY_BITS_FIELD(RSVED, 5, 11) // [15:11] 保留位（必须写0）
            DECLARE_MEMORY_BIT(RTOS, 10) // [10]    实时操作系统中断标志/掩码位
            DECLARE_MEMORY_BIT(DLOG, 9) // [9]     数据日志中断标志/掩码位
            DECLARE_MEMORY_BIT(BERR, 8) // [8]     总线错误中断标志/掩码位
            DECLARE_MEMORY_BIT(I2C, 7) // [7]     I2C中断标志/掩码位（原表12C应为I2C）
            DECLARE_MEMORY_BIT(TINT1, 6) // [6]     定时器1中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC3, 5) // [5]     DMA通道3中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC2, 4) // [4]     DMA通道2中断标志/掩码位（原表RMAC2应为DMAC2）
            DECLARE_MEMORY_BIT(INT4_RTC, 3) // [3]     外部中断4或实时时钟中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC0, 2) // [2]     DMA通道0中断标志/掩码位
            DECLARE_MEMORY_BIT(XINT0, 1) // [1]     McBSP发送0中断标志/掩码位（原表XINTO应为XINT0）
            DECLARE_MEMORY_BIT(INT1, 0) // [0]     外部用户中断1标志/掩码位
        END_MEMORY_REGION()

        BEGIN_MEMORY_REGION(DBIER0, 0x0047) // 调试中断使能寄存器0   [15-0]
            DECLARE_MEMORY_BIT(DMAC5, 15) // DMA通道5中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DMAC4, 14) // DMA通道4中断标志/屏蔽位
            DECLARE_MEMORY_BIT(XINT2, 13) // XINT2外部中断或MMC/SD2中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT2, 12) // McBSP2接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(INT3, 11) // 外部中断3或看门狗定时器中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DSPINT, 10) // HPI主机到DSP的中断标志/屏蔽位
            DECLARE_MEMORY_BIT(DMAC1, 9) // DMA通道1中断标志/屏蔽位
            DECLARE_MEMORY_BIT(USB, 8) // USB中断标志/屏蔽位
            DECLARE_MEMORY_BIT(XINT1, 7) // XINT1外部中断或MMC/SD1中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT1, 6) // McBSP1接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(RINT0, 5) // McBSP0接收中断标志/屏蔽位
            DECLARE_MEMORY_BIT(TINT0, 4) // 定时器0中断标志位
            DECLARE_MEMORY_BIT(INT2, 3) // 外部中断2标志位
            DECLARE_MEMORY_BIT(INT0, 2) // 外部中断1标志位（注意表格中疑似标注错误）
            DECLARE_MEMORY_BITS_FIELD(RSVED, 2, 0) // 位1-0为保留位（0x0002-0x0001），需保持写0
        END_MEMORY_REGION()

        BEGIN_MEMORY_REGION(DBIER1, 0x0048) // 调试中断使能寄存器1   [15-0]
            DECLARE_MEMORY_BITS_FIELD(RSVED, 5, 11) // [15:11] 保留位（必须写0）
            DECLARE_MEMORY_BIT(RTOS, 10) // [10]    实时操作系统中断标志/掩码位
            DECLARE_MEMORY_BIT(DLOG, 9) // [9]     数据日志中断标志/掩码位
            DECLARE_MEMORY_BIT(BERR, 8) // [8]     总线错误中断标志/掩码位
            DECLARE_MEMORY_BIT(I2C, 7) // [7]     I2C中断标志/掩码位（原表12C应为I2C）
            DECLARE_MEMORY_BIT(TINT1, 6) // [6]     定时器1中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC3, 5) // [5]     DMA通道3中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC2, 4) // [4]     DMA通道2中断标志/掩码位（原表RMAC2应为DMAC2）
            DECLARE_MEMORY_BIT(INT4_RTC, 3) // [3]     外部中断4或实时时钟中断标志/掩码位
            DECLARE_MEMORY_BIT(DMAC0, 2) // [2]     DMA通道0中断标志/掩码位
            DECLARE_MEMORY_BIT(XINT0, 1) // [1]     McBSP发送0中断标志/掩码位（原表XINTO应为XINT0）
            DECLARE_MEMORY_BIT(INT1, 0) // [0]     外部用户中断1标志/掩码位
        END_MEMORY_REGION()

        // 系统类寄存器
        DECLARE_MEMORY_REGION(IVPD, 0x0049) // 中断向量页指针        [15-0]
        DECLARE_MEMORY_REGION(IVPH, 0x004A) // 中断向量页指针       [15-0]
        DECLARE_MEMORY_REGION(ST2_55, 0x004B) // 保留区域             [15-0]
        DECLARE_MEMORY_REGION(SSP, 0x004C) // 系统堆栈指针          [15-0]
        DECLARE_MEMORY_REGION(USP, 0x004D) // 用户堆栈指针          [15-0](原为SP)
        DECLARE_MEMORY_REGION(SPH, 0x004E) // 扩展堆栈页指针        [6-0]
        DECLARE_MEMORY_REGION(CDPH, 0x004F) // CDP高位页指针         [6-0]
    }
}

#endif //ZQ_CPU_H
